#ifndef CONSTANTES_ET_MACROS_H
#   define CONSTANTES_ET_MACROS_H

#include "SDL/SDL.h"
#include "SDL/SDL_ttf.h"
#include "ncurses.h"




/**
 * \file constantes_et_macros.h
 * Ce fichier contient, comme son nom l'indique,
 * les constantes et les macros du projet.\n
 * Pour plus d'informations, consulter les commentaires du code source, qui est
 * directement accessible via cette documentation.
 */



/* macro pour les resume_souris_echap */
#define GET_COORD_SOURIS(saisie, x, y) x = saisie->x_souris; y = saisie->y_souris


/* macro pour obtenir la taille de quatre types */
#define GET_TAILLES(u_c, c, u_i, i) u_c = sizeof(unsigned char); c = sizeof(char); u_i = sizeof(unsigned int); i = sizeof(int)


/* macros pour modifier le contenu des tableaux de positions */
#define SET_DISTANCE(t, x, y, d) t->tab_positions[(x) + (y) * (1 + 2 * NB_IT)].distance = d
#define SET_DIRECTION(t, x, y, d) t->tab_positions[(x) + (y) * (1 + 2 * NB_IT)].direction = d
#define SET_DISTANCE_ET_DIRECTION(t, x, y, dist, dire) t->tab_positions[(x) + (y) * (1 + 2 * NB_IT)].distance = dist; t->tab_positions[(x) + (y) * (1 + 2 * NB_IT)].direction = dire
#define GET_DISTANCE(t, x, y) t->tab_positions[(x) + (y) * (1 + 2 * NB_IT)].distance
#define GET_DIRECTION(t, x, y) t->tab_positions[(x) + (y) * (1 + 2 * NB_IT)].direction
#define DISTANCE_ENTRE(xa, ya, xb, yb) (abs(xa - xb) + abs(ya - yb))
#define GET_COORD_CAS(x, y, t, n) x = t->lecture->tab[n].x; y = t->lecture->tab[n].y;


/* booleens */
#define VRAI 1
#define FAUX 0


/* codes d'erreurs */
#define EXIT_MALLOC 10


/* statistiques en debut de partie */
/*#define DIEU*/
#if defined DIEU
#   define VALEUR_DEPART_PV 5000
#   define VALEUR_DEPART_STATS 150
#else
#   define VALEUR_DEPART_PV 25
#   define VALEUR_DEPART_STATS 5
#endif


/* pour debug : donne 999 exemplaires des objets en debut de partie */
/*#define STUFF*/


/*
 * permet de remporter la victoire en appuyant
 * simultanement sur F1 ou F2 ou F3 et entree
 */
#define CHEAT


/* designation des champs de saisie sdl */
#define DEPLACEMENT 0
#define DIRECTION_TIR 1


/* touches (pour ncurses) */
#define FLECHE_HAUT 0
#define FLECHE_DROITE 1
#define FLECHE_BAS 2
#define FLECHE_GAUCHE 3
#define ENTREE 4
#define ECHAP 5


/* exploration */
#define JAMAIS_VUE 0
#define DEJA_VUE 1
#define EXPLOREE 2


/* relief */
#define RELIEF_POSITIF 1
#define RELIEF_NEGATIF 2
#define RELIEF_PLAT 0


/* types d'attaques */
#define CONTACT 0
#define DISTANCE 1


/* types d'objets - Pour plus d'infos, voir la structure description_objet */
#define MATERIAU 'm'
#define UTILISABLE 'u'
#define ARME 'a'
#define VESTE 'v'
#define GANT 'g'
#define CHAUSSURE 'c'
#define ACCESSOIRE 's'
/*
 * constantes additionnelles pour designer explicitement
 * un champ dans les objets utilisables
 */
#define UTIL_1 'p'
#define UTIL_2 'q'
#define UTIL_3 'r'


/* types de transactions */
#define ACHAT 1
#define VENTE 2


/* orientation */
#define NEUTRE 4
#define HAUT 0
#define DROITE 1
#define BAS 2
#define GAUCHE 3


/* equipement */
#define VIDE -1
#define ID_ARME_DE_BASE 0


/* affichage */
#define DIM_ECRAN_X 790
#define DIM_ECRAN_Y 728
#define BPP 24
#define CHAMP_VISION_X 18
#define CHAMP_VISION_Y 18
#define POSITION_CHAMP_VISION_X 0
#define POSITION_CHAMP_VISION_Y 53
#define POSITION_POINTS_VIE_JOUEUR_X 8
#define POSITION_POINTS_VIE_JOUEUR_Y 3
#define POSITION_BARRE_VIE_JOUEUR_X 5
#define POSITION_BARRE_VIE_JOUEUR_Y 21
#define POSITION_BARRE_CHARGE_X 320
#define POSITION_BARRE_CHARGE_Y 26
#define POSITION_BARRES_VIE_ENNEMIS_X 615
#define POSITION_BARRES_VIE_ENNEMIS_Y 40
#define ESPACEMENT_BARRES_VIE_ENNEMIS 32
#define POSITION_OBJETS_X 5
#define POSITION_OBJETS_Y 650


/* disposition des elements pour carte region */
/*
 * nombre de pixels correspondant a une unite de distance pour la
 * carte de region, sachant qu'une zone fait 3 unites de large et
 * que les raccords en font 1
 */
#define UNITE_CARTE_REGION 10
#define POSITION_NOM_REGION_X 20
#define POSITION_NOM_REGION_Y 8
#define POSITION_EXPLICATIONS_REGION_X 15
#define POSITION_EXPLICATIONS_REGION_Y 650
#define POSITION_CARTE_REGION_X 140
#define POSITION_CARTE_REGION_Y 100
#define POSITION_LEGENDE_REGION_X 10
#define POSITION_LEGENDE_REGION_Y 540
#define DECALAGE_LEGENDE_REGION 280


/* disposition des elements pour carte monde */
#define POSITION_TITRE_MONDE_X 50
#define POSITION_TITRE_MONDE_Y 6
#define POSITION_CARTE_MONDE_X 10
#define POSITION_CARTE_MONDE_Y 70
#define LARGEUR_REGIONS 80
#define HAUTEUR_REGIONS 32


/* victoire */
#define VICTOIRE 0
#define DEFAITE 1
#define PAS_TERMINEE 2


/* designation explicite d'un champ de statistiques */
#define PUISSANCE 0
#define POINTS_VIE 1
#define VITESSE_CHARGE 2
#define VITESSE_DEPLACEMENT 3


/*
 * scores de deplacement
 * Explications : a chaque tour de la boucle d'evenements :
 * - si le score de deplacement d'un individu est superieur ou egal
 *   a SEUIL_DEPLACEMENT, il peut bouger. S'il bouge, on retire
 *   SEUIL_DEPLACEMENT a son score de deplacement.
 * - si le score de deplacement est inferieur a SEUIL_DEPLACEMENT, on ajoute
 *   au score MIN_DEPLACEMENT +
 *            COEFF_DEPLACEMENT * <vitesse de deplacement de l'individu>
 *   puis, si cela lui a permi d'atteindre le seuil, il peut bouger dans la
 *   foulee, en payant le seuil, comme dans le cas precedent.
 * Notons que si quelqu'un tente de bouger mais se heurte a un obstacle,
 * son score de deplacement n'est pas reduit.
 */
#define SEUIL_DEPLACEMENT 2340
#define COEFF_DEPLACEMENT 11
#define MIN_DEPLACEMENT 140


/* scores de charge (meme fonctionnement que scores de deplacement */
#define SEUIL_CHARGE 23400
#define COEFF_CHARGE 11
#define MIN_CHARGE 140


/* taux */
#define TAUX_DROP 1
#define TAUX_EXP 1
#define NB_POINTS_PAR_NIVEAU 3
#define PTS_VIE_PAR_POINT 5


/*
 * dimensions du joueur
 * Explications : les deux valeurs de decalage donnent le nombre de cases
 * de difference entre le centre du joueur et son coin superieur gauche.
 * Il sagit donc de l'oppose de l'arrondi a l'inferieur
 * de la moitie  de TAILLE_JOUEUR : par exemple 3 -> -3/2 -> -1
 */
#define TAILLE_JOUEUR 3
#define DECALAGE_X_J -1
#define DECALAGE_Y_J -1


/*
 * chronometrage
 * INTERVALE est le nombre de millisecondes qui doivent au minimum s'ecouler
 * avant de pouvoir refaire un tour dans la boucle d'evenements
 */
#define INTERVALE 0


/* constantes pour le menu principal */
#define QUITTER -1
#define JOUER 1


/* taille des fonts */
#define TAILLE_FONT_DEFAUT 17
#define TAILLE_FONT_TITRES 50


/* maximums */
#define MAX_Q_OBJET 999
#define MAX_ARGENT 999999999
#define MAX_EXPERIENCE 999999999


/**
 * taille du tableau dans tab_regions_accessibles.
 * Cette constante doit toujours etre au moins egale au nombre de regions
 * contenues dans le jeu.
 */
#define MAX_REGIONS_ACCESSIBLES 5


/**
 * limite du nombre de parties lisibles
 * lors du chargement des noms de parties
 */
#define MAX_NOMBRE_DE_PARTIES 128


/** nombre d'iterations pour le choix de direction des ennemis */
#define NB_IT 30


/**
 * taille des tableaux servant de file pour le deplacement des ennemis
 * taille conseillee : (4/5)(2i^2 + 2i + 1), i etant NB_IT
 */
#define TAILLE_TAB_FILE 2000


/**
 * Represente une distance infinie
 */
#define INF -1


/** Si faible, les ennemis seront reticents a parcourir de grandes distances */
#define MOTIVATION_ENNEMIS 10


/* types */
typedef SDL_Surface surface_jeu;
typedef SDL_Rect rectangle_pour_surface;
typedef SDL_Color couleur_pour_surface;
typedef TTF_Font font;
typedef WINDOW fenetre_texte;


#endif
